package n90_JDK线程池;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @author fu
 * @date 2022-03-30 22:41
 */
@Slf4j(topic = "c.T3")
public class T3_Executors关闭线程池 {

    public static void main(String[] args) throws InterruptedException {

//        _test_shutdown();
        _test_shutdownNow();

    }

    /**
     * shutdown     【线程池的整体状态变为 SHUTDOWN】
     *  不会接受新任务
     *  执行完->已提交的任务（包括队列里的）
     *  打断空闲线程
     *  主线程[不会等待]直接往下执行
     */
    private static void _test_shutdown()  throws InterruptedException {
        // shutdown 执行完->已提交的任务（包括队列里的）
        final ExecutorService pool = Executors.newFixedThreadPool(2);

        final Future<Integer> res1 = pool.submit(() -> {
            log.debug("task 1 running...");
            Thread.sleep(2000);
            log.debug("task 1 --end--");
            return 1;
        });
        final Future<Integer> res2 = pool.submit(() -> {
            log.debug("task 2 running...");
            Thread.sleep(2000);
            log.debug("task 2 --end--");
            return 2;
        });
        final Future<Integer> res3 = pool.submit(() -> {
            log.debug("task 3 running...【队列里拿出来--执行】");
            Thread.sleep(2000);
            log.debug("task 3 --end-----【队列里拿出来--执行】");
            return 3;
        });

        log.debug("------ begin shutdown------");
        pool.shutdown();
        log.debug("------ end   shutdown------");// 主线程[不会等待]直接往下执行

//>>>>>>>>>>>>>>>>>>>>>HEAD  >>>>>> shutdown 之后提交任务 将失败 拒绝策略报异常
//-------------------------
//        final Future<Integer> res4 = pool.submit(() -> {
//            log.debug("task 4 running...【shutdown 之后提交任务】");
//            Thread.sleep(2000);
//            log.debug("task 4 --end-----【shutdown 之后提交任务】");
//            return 3;
//        });
//<<<<<<<<<<<<<<<<<<<<<<<<<

        // 时间等够了 or 所有任务执行完了，---> 才往下执行  【--- 一般不使用 ---】
        pool.awaitTermination(3, TimeUnit.SECONDS);
        log.debug("+++++++  后面代码1 +++++++");
        log.debug("+++++++  后面代码2 +++++++");
        log.debug("+++++++  后面代码3 +++++++");


    }

    /**
     * shutdownNow  【线程池的整体状态变为 STOP】
     *  不会接受新任务
     *  [--- 队列的任务 全部停止 并[返回]作为返回结果 ---]
     *  打断所有线程 interrupt打断
     */
    private static void _test_shutdownNow(){
        // shutdown 执行完->已提交的任务（包括队列里的）
        final ExecutorService pool = Executors.newFixedThreadPool(2);

        final Future<Integer> res1 = pool.submit(() -> {
            log.debug("task 1 running...");
            Thread.sleep(2000);
            log.debug("task 1 --end--");
            return 1;
        });
        final Future<Integer> res2 = pool.submit(() -> {
            log.debug("task 2 running...");
            Thread.sleep(2000);
            log.debug("task 2 --end--");
            return 2;
        });
        final Future<Integer> res3 = pool.submit(() -> {
            log.debug("task 3 running...");
            Thread.sleep(2000);
            log.debug("task 3 --end--");
            return 3;
        });
        System.out.println("---任务3提交---" + res3.toString());

        log.debug("------ begin shutdownNow------");
        final List<Runnable> runnableList = pool.shutdownNow();
        log.debug("------ end   shutdownNow1------");// 主线程[不会等待]直接往下执行

        log.debug("runnableList={}",runnableList);
    }

}
